package com.roamer.audition.server.query.base;

import com.roamer.validator.EnumValue;

import java.lang.annotation.*;

/**
 * JPA动态查询注解，标识字段
 *
 * @author roamer
 * @version V1.0
 * @date 2019/8/25 11:06 下午
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@Documented
public @interface QueryCondition {

    // 数据库中字段名,默认为空字符串,则Query类中的字段要与数据库中字段一致
    String column() default "";

    // equal, like, gt, lt...
    MatchType func() default MatchType.eq;

    // object是否可为null，为null则忽视
    boolean nullable() default false;

    // 字符串是否不可为空，为空则忽视
    boolean notEmpty() default true;

    QueryEnum[] queryEnums() default {};

    /**
     * JPA动态查询连接条件
     *
     * @author roamer
     * @version V1.0
     * @date 2019/8/25 10:37 下午
     */
    enum MatchType {

        /** filed = value */
        eq,
        /** field != value */
        notEqual,
        /** field in value */
        in,
        /** field in value */
        notIn,
        /** field like %value% */
        like,
        /** field like value% */
        startsWith,
        /** field like %value */
        endsWith,
        /** field not like value */
        notLike,

        // 下面四个用于Number类型的比较
        /** filed > value */
        gt,
        /** field >= value */
        ge,
        /** field < value */
        lt,
        /** field <= value */
        le,

        // 下面四个用于可比较类型(Comparable)的比较
        /** filed > value */
        greaterThan,
        /** field >= value */
        greaterThanOrEqualTo,
        /** field < value */
        lessThan,
        /** field <= value */
        lessThanOrEqualTo,
        ;
    }

    @interface QueryEnum {
        /**
         * 指定的枚举类
         *
         * @return {@code Class<? extends Enum<?>>}
         */
        Class<? extends Enum<?>> enumClass();

        /**
         * 用于转换的方法
         * <p>
         * 必须为static修饰，返回值为EnumClass类型
         *
         * @return {@code String} {@link EnumValue#enumClass}中的函数名称
         */
        String enumMethod();
    }
}
